package cn.hinglo.permission.controller;

import cn.hinglo.common.annotation.RequestMapping;
import cn.hinglo.common.config.base.BaseController;
import cn.hinglo.common.interceptors.request.Delete;
import cn.hinglo.common.interceptors.request.Get;
import cn.hinglo.common.interceptors.request.Post;
import cn.hinglo.common.interceptors.request.Put;
import cn.hinglo.permission.model.JobBean;
import cn.hinglo.permission.service.QuartzService;
import cn.hutool.core.util.ClassUtil;
import com.jfinal.aop.Before;
import com.jfinal.aop.Inject;
import com.jfinal.core.paragetter.Para;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @author HingLo
 * @description: 定时任务管理类
 */
@RequestMapping("/quartz")
@Slf4j
public class QuartzController extends BaseController {

    @Inject
    private QuartzService quartzService;

    @Before(Get.class)
    public void list(Integer page, Integer size) {
        success(quartzService.listService(getPage(page), getSize(size)));
    }

    /***
     * 添加定是任务
     * @param job 添加的定时任务对象
     */
    @Before(Post.class)
    public void add(@Para("") JobBean job) {
        success(quartzService.addTaskService(job));
    }

    /***
     * 暂停指定的任务
     * @param id 定时任务编号
     */
    @Before(Put.class)
    public void pause(Integer id) {
        success(quartzService.pauseJobService(id));
    }

    /***
     * 恢复指定的任务
     * @param id 定时任务编号
     */
    @Before(Put.class)
    public void resume(Integer id) {
        success(quartzService.resumeJobService(id));
    }

    /***
     * 删除定时定时任务
     * @param id 定时任务编号
     */
    @Before(Delete.class)
    public void delete(Integer id) {
        success(quartzService.deleteJobService(id));
    }


    /***
     * 更新定时任务信息
     * @param id id
     * @param corn 表达式
     */
    @Before(Put.class)
    public void update(Integer id, String corn) {
        success(quartzService.updateService(id, corn));
    }

    /***
     * 获取全部的定时任务执行类
     */
    @Before(Get.class)
    public void clazz() {
        Set<Class<?>> set = ClassUtil.scanPackageBySuper("", Job.class);
        List<String> list = new ArrayList<>();
        set.forEach(action -> list.add(action.getName()));
        success(list);
    }


    /***
     *  手动触发定时任务
     * @param id 定时任务唯一编号
     */
    @Before(Get.class)
    public void execute(Integer id) {
        result(quartzService.execute(id), "定时任务执行失败,请查看日志了解详情");
    }

}
